Contents
Setup and data wrangling
Data tables
Survival analysis
Stratified survival analysis
Create KM for OS and PFS, stratify by HRCA
KM of OS & PFS, stratified by cell dose
KM of PFS, dose level 1 vs 2-4
Create KM for OS, stratified by sCR/CR vs VGPR/PR
Create KM for OS & PFS, stratified by treatment lines <8 vs >=8
Create KM for OS & PFS, stratified by hx of prior allo
Create KM for OS & PFS, stratified by receipt of prior BCMA-directed therapy
Create KM for OS & PFS, stratified by triple refractory disease
Create KM for OS & PFS, stratified by penta refractory disease
Create KM for OS & PFS, stratified by tumor burden (BMPCs <=30 vs >30)
Create KM for OS & PFS, stratified by sBCMA at day 90 (< vs >= median)
Create KM for OS & PFS, stratified by sBCMA at day 60 (< vs >= median)
Create KM for OS & PFS, stratified by BCMA ABC at screening
Regression analysis
Scatterplot
Probability plots
Setup and data wrangling
Load necessary packages
Read in the data
Show code
db1 = read_excel ( path = "9762 data for analysis 1.23.24.xlsx" , sheet = "Survival" )
dataset <- db1 %>%
mutate (
dx_dt = ymd ( dx_dt ) ,
infuse_dt = ymd ( infuse_dt ) ,
birthdate = ymd ( birthdate ) ,
dt_relapse = ymd ( dt_relapse ) ,
Death.or.DLC = ymd ( Death.or.DLC ) ,
Death.or.relapse.or.DLC = ymd ( Death.or.relapse.or.DLC ) ,
Days.to.death.or.DLC = Death.or.DLC - infuse_dt ,
Days.to.death.or.relapse.or.DLC = Death.or.relapse.or.DLC - infuse_dt ,
Days.from.dx.to.infusion = infuse_dt - dx_dt ,
Age = ( infuse_dt - birthdate ) / 365
)
Data tables
Table 1 reproduction
Show code
theme_gtsummary_compact ( )
dataset %>%
transmute (
"Age (years)" = Age ,
"Female sex" = ifelse ( sex == "f" , 1 , 0 ) ,
"Race" = recode ( race , "asian" = "Asian" , "white" = "White" ) ,
"ECOG performance status" = ecog ,
"Median time from diagnosis to CAR T cell therapy" = Days.from.dx.to.infusion / 365 ,
"Disease subtype" = factor ( subtype_category , levels = c ( "IgA" , "IgG" , "IgM" , "Light chain" , "Oligosecretory" , "Primary plasma cell leukemia" ) ) ,
"ISS disease stage at diagnosis" = iss ,
"Revised ISS disease stage at diagnosis" = riss ,
"ISS disease stage at enrollment" = iss_enrollment ,
"Revised ISS disease stage at enrollment" = riss_enrollment ,
#"High-risk cytogenetic abnormality at any time" = HRCA,
"t(4;14) any" = t414_any ,
"t(14;16) any" = t1416_any ,
"del(17p) any" = del17p_any ,
"amp(1q) any" = amp1q_any ,
"High bone marrow tumor burden" = ifelse ( High.tumor.burden == 1 , ">30%" , "10-30%" ) ,
"Extramedullary disease" = extramedullary ,
"Circulating plasma cells at screening" = cpcs ,
"Tumor BCMA expression (ABC)" = bcma_scrn ,
"Number of previous antimyeoma regimens" = factor ( case_when (
no_priortx <= 6 ~ "4-6" ,
no_priortx > 6 & no_priortx <= 9 ~ "7-9" ,
no_priortx > 9 ~ "10 or more" ) , levels = c ( "4-6" , "7-9" , "10 or more" ) ) ,
"Previous autologous HCT" = factor ( case_when (
no_auto == 0 ~ "0" ,
no_auto == 1 ~ "1" ,
no_auto > 1 ~ ">1" ) , levels = c ( "0" ,"1" ,">1" ) ) ,
"Previous allogeneic HCT" = allo
) %>%
tbl_summary (
missing = "ifany" ,
statistic = list (
all_continuous ( ) ~ "{median} ({min} to {max})" ,
all_categorical ( ) ~ "{n} ({p}%)"
)
) %>%
bold_labels ( ) %>%
add_variable_grouping (
"High-risk cytogenetic abnormality at any time" = c ( "t(4;14) any" , "t(14;16) any" , "del(17p) any" , "amp(1q) any" )
)
Characteristic
N = 25
Age (years)
64 (38 to 77)
Female sex
9 (36%)
Race
Asian
3 (12%)
White
22 (88%)
ECOG performance status
0
5 (20%)
1
17 (68%)
2
3 (12%)
Median time from diagnosis to CAR T cell therapy
5.1 (1.6 to 14.6)
Disease subtype
IgA
4 (16%)
IgG
13 (52%)
IgM
2 (8.0%)
Light chain
3 (12%)
Oligosecretory
1 (4.0%)
Primary plasma cell leukemia
2 (8.0%)
ISS disease stage at diagnosis
1
4 (20%)
2
6 (30%)
3
10 (50%)
Unknown
5
Revised ISS disease stage at diagnosis
1
2 (18%)
2
3 (27%)
3
6 (55%)
Unknown
14
ISS disease stage at enrollment
1
12 (63%)
2
5 (26%)
3
2 (11%)
Unknown
6
Revised ISS disease stage at enrollment
1
6 (32%)
2
11 (58%)
3
2 (11%)
Unknown
6
High-risk cytogenetic abnormality at any time
t(4;14) any
2 (8.0%)
t(14;16) any
2 (8.0%)
del(17p) any
13 (52%)
amp(1q) any
3 (12%)
High bone marrow tumor burden
>30%
17 (68%)
10-30%
8 (32%)
Extramedullary disease
11 (44%)
Circulating plasma cells at screening
5 (20%)
Tumor BCMA expression (ABC)
620 (175 to 5,521)
Number of previous antimyeoma regimens
4-6
6 (24%)
7-9
13 (52%)
10 or more
6 (24%)
Previous autologous HCT
0
5 (20%)
1
13 (52%)
>1
7 (28%)
Previous allogeneic HCT
5 (20%)
Survival analysis
Length of follow-up
Show code
data1 = dataset %>%
mutate (
Reverse_death = ifelse ( death == 1 , 0 ,1 )
)
#quantile(prodlim(Hist(time = Real.days.DLC/30, Real.death )~1, data = data1, reverse = TRUE ) )
reverse_km_OS <- survfit ( Surv ( Days.to.death.or.DLC / 30 , Reverse_death ) ~ 1 , data1 )
reverse_km_OS
Call: survfit(formula = Surv(Days.to.death.or.DLC/30, Reverse_death) ~
1, data = data1)
n events median 0.95LCL 0.95UCL
[1,] 25 6 58.6 47.4 NA
Create KM for OS and PFS
Show code
km_OS <- survfit ( Surv ( Days.to.death.or.DLC / 30 , death ) ~ 1 , data = dataset )
med_OS <- surv_median ( km_OS )
OS <- ggsurvplot ( km_OS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Overall survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
OS $ plot <- OS $ plot + geom_hline ( yintercept = 0.5 , linetype = "dashed" , color = "grey" ) + annotate ( "text" , x = med_OS $ median + 0.5 , y = 0.54 , label = paste ( signif ( med_OS $ median , 2 ) , "(95% CI, " , signif ( med_OS $ lower , 2 ) , "to" , signif ( med_OS $ upper , 2 ) ,")" ) , hjust = 0 , size = 5 )
OS
Show code
Call: survfit(formula = Surv(Days.to.death.or.DLC/30, death) ~ 1, data = dataset)
n events median 0.95LCL 0.95UCL
[1,] 25 19 32.1 20.4 NA
Show code
Call: survfit(formula = Surv(Days.to.death.or.DLC/30, death) ~ 1, data = dataset)
time n.risk n.event survival std.err lower 95% CI upper 95% CI
12 22 3 0.88 0.065 0.761 1
Show code
km_PFS <- survfit ( Surv ( Days.to.death.or.relapse.or.DLC / 30 , relapse ) ~ 1 , data = dataset )
med_PFS <- surv_median ( km_PFS )
PFS <- ggsurvplot ( km_PFS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Progression-free survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
PFS $ plot <- PFS $ plot + geom_hline ( yintercept = 0.5 , linetype = "dashed" , color = "grey" ) + annotate ( "text" , x = med_PFS $ median + 0.5 , y = 0.54 , label = paste ( signif ( med_PFS $ median , 2 ) , "(95% CI, " , signif ( med_PFS $ lower , 2 ) , "to" , signif ( med_PFS $ upper , 2 ) ,")" ) , hjust = 0 , size = 5 )
PFS
Show code
Call: survfit(formula = Surv(Days.to.death.or.relapse.or.DLC/30, relapse) ~
1, data = dataset)
n events median 0.95LCL 0.95UCL
[1,] 25 22 18 8.73 27.5
Show code
Call: survfit(formula = Surv(Days.to.death.or.relapse.or.DLC/30, relapse) ~
1, data = dataset)
time n.risk n.event survival std.err lower 95% CI upper 95% CI
12 16 9 0.64 0.096 0.477 0.859
PFS and OS on the same plot
Show code
OS_EFS <- ggsurvplot_combine ( list ( km_PFS , km_OS ) ,
data= db ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.3 ,
tables.theme = theme_cleantable ( ) ,
surv.median.line = "hv" , # Specify median survival
ggtheme = theme_classic ( ) +
theme (
axis.text.x = element_text ( size = 12 ) , # Increase x-axis label font size
axis.text.y = element_text ( size = 12 ) , # Increase y-axis label font size
axis.title.x = element_text ( size = 14 ) , # Increase x-axis title font size
axis.title.y = element_text ( size = 14 ) , # Increase y-axis title font size
plot.title = element_text ( size = 12 ) , # Increase plot title font size
legend.text = element_text ( size = 12 ) , # Increase legend text font size
legend.title = element_text ( size = 12 ) # Increase legend title font size
) ,
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "PFS & OS (%)" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend = "none" ,
#fun=formula,
legend.labs = c ( "PFS" ,"OS" ) ,
surv.scale = "percent" ,
censor= FALSE
)
OS_EFS $ plot <- OS_EFS $ plot +
geom_hline ( yintercept = 0.5 , linetype = "dashed" , color = "grey" ) +
geom_vline ( xintercept = median ( km_OS ) [ 1 ] , linetype = "dashed" , color = "grey" ) +
geom_vline ( xintercept = median ( km_PFS ) [ 1 ] , linetype = "dashed" , color = "grey" ) +
annotate ( "text" , x = med_OS $ median + 0.5 , y = 0.85 , label = paste ( signif ( med_OS $ median , 2 ) , "(" , signif ( med_OS $ lower , 2 ) , "-" , signif ( med_OS $ upper , 2 ) ,")" ) , hjust = 0 , size = 5 ) +
annotate ( "text" , x = med_PFS $ median + 0.5 , y = 0.95 , label = paste ( signif ( med_PFS $ median , 2 ) , "(" , signif ( med_PFS $ lower , 2 ) , "-" , signif ( med_PFS $ upper , 2 ) ,")" ) , hjust = 0 , size = 5 )
OS_EFS
Create KM for DOR
Show code
km_DOR <- survfit ( Surv ( ( Days.to.death.or.relapse.or.DLC - 28 ) / 30 , relapse ) ~ 1 , data = dataset )
med_DOR <- surv_median ( km_DOR )
DOR <- ggsurvplot ( km_DOR ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Duration of response" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
DOR $ plot <- DOR $ plot + geom_hline ( yintercept = 0.5 , linetype = "dashed" , color = "grey" ) + annotate ( "text" , x = med_DOR $ median + 0.5 , y = 0.54 , label = paste ( signif ( med_DOR $ median , 2 ) , "(95% CI, " , signif ( med_DOR $ lower , 2 ) , "to" , signif ( med_DOR $ upper , 2 ) ,")" ) , hjust = 0 , size = 5 )
DOR
Show code
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC - 28)/30,
relapse) ~ 1, data = dataset)
n events median 0.95LCL 0.95UCL
[1,] 25 22 17.1 7.8 26.6
Show code
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC - 28)/30,
relapse) ~ 1, data = dataset)
time n.risk n.event survival std.err lower 95% CI upper 95% CI
12 14 11 0.56 0.0993 0.396 0.793
Stratified survival analysis
Create KM for OS and PFS, stratify by HRCA
Show code
km_OS <- survfit ( Surv ( Days.to.death.or.DLC / 30 , death ) ~ HRCA , data = dataset )
km_OS
Call: survfit(formula = Surv(Days.to.death.or.DLC/30, death) ~ HRCA,
data = dataset)
n events median 0.95LCL 0.95UCL
HRCA=0 10 7 32.1 18.5 NA
HRCA=1 15 12 27.5 17.7 NA
Show code
med_OS <- surv_median ( km_OS )
OS <- ggsurvplot ( km_OS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Overall survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" ) ,
legend.labs = c ( "Standard" ,"High risk" )
)
#OS$plot <- OS$plot + geom_hline(yintercept = 0.5, linetype = "dashed", color = "grey") + annotate("text", x = med_OS$median + 0.5, y = 0.54, label = paste("Median =", signif(med_OS$median, 2), "(95% CI, ", signif(med_OS$lower, 2), "to", signif(med_OS$upper, 2),")"), hjust = 0, size = 5)
OS
Show code
km_PFS <- survfit ( Surv ( Days.to.death.or.relapse.or.DLC / 30 , relapse ) ~ HRCA , data = dataset )
km_PFS
Call: survfit(formula = Surv(Days.to.death.or.relapse.or.DLC/30, relapse) ~
HRCA, data = dataset)
n events median 0.95LCL 0.95UCL
HRCA=0 10 8 20.6 7.33 NA
HRCA=1 15 14 14.0 8.73 NA
Show code
med_PFS <- surv_median ( km_PFS )
PFS <- ggsurvplot ( km_PFS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Progression-free survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" ) ,
legend.labs = c ( "Standard" ,"High risk" )
)
#PFS$plot <- PFS$plot + geom_hline(yintercept = 0.5, linetype = "dashed", color = "grey") + annotate("text", x = med_PFS$median + 0.5, y = 0.54, label = paste("Median =", signif(med_PFS$median, 2), "(95% CI, ", signif(med_PFS$lower, 2), "to", signif(med_PFS$upper, 2),")"), hjust = 0, size = 5)
PFS
KM of OS & PFS, stratified by cell dose
Show code
km_PFS <- survfit ( Surv ( Days.to.death.or.relapse.or.DLC / 30 , relapse ) ~ intended_cell_dose , data = dataset )
km_PFS
Call: survfit(formula = Surv(Days.to.death.or.relapse.or.DLC/30, relapse) ~
intended_cell_dose, data = dataset)
n events median 0.95LCL 0.95UCL
intended_cell_dose=5e+07 7 6 18.00 5.87 NA
intended_cell_dose=1.5e+08 8 7 24.32 12.20 NA
intended_cell_dose=3e+08 7 6 23.20 12.63 NA
intended_cell_dose=4.5e+08 3 3 7.87 3.07 NA
Show code
med_PFS <- surv_median ( km_PFS )
PFS <- ggsurvplot ( km_PFS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.4 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Progression-free survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" ) ,
#legend.labs = c("Standard","High risk")
)
PFS
Show code
km_OS <- survfit ( Surv ( ( Days.to.death.or.DLC ) / 30 , death ) ~ intended_cell_dose , data = data1 )
med_OS <- surv_median ( km_OS )
OS <- ggsurvplot ( km_OS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.4 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Overall survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
OS
Show code
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ intended_cell_dose,
data = data1)
n events median 0.95LCL 0.95UCL
intended_cell_dose=5e+07 7 7 25.4 10.1 NA
intended_cell_dose=1.5e+08 8 4 58.4 27.5 NA
intended_cell_dose=3e+08 7 5 32.1 20.4 NA
intended_cell_dose=4.5e+08 3 3 18.5 16.6 NA
KM of PFS, dose level 1 vs 2-4
Show code
data1 <- dataset %>%
mutate (
dose_level = ifelse ( intended_cell_dose == "5e+07" ,"1" ,"2-4" )
)
km_PFS <- survfit ( Surv ( Days.to.death.or.relapse.or.DLC / 30 , relapse ) ~ dose_level , data = data1 )
km_PFS
Call: survfit(formula = Surv(Days.to.death.or.relapse.or.DLC/30, relapse) ~
dose_level, data = data1)
n events median 0.95LCL 0.95UCL
dose_level=1 7 6 18.0 5.87 NA
dose_level=2-4 18 16 17.5 8.73 37.4
Show code
med_PFS <- surv_median ( km_PFS )
PFS <- ggsurvplot ( km_PFS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Progression-free survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend.labs = c ( "1" ,"2-4" ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" ) ,
#legend.labs = c("Standard","High risk")
)
#PFS$plot <- PFS$plot + geom_hline(yintercept = 0.5, linetype = "dashed", color = "grey") + annotate("text", x = med_PFS$median + 0.5, y = 0.54, label = paste("Median =", signif(med_PFS$median, 2), "(95% CI, ", signif(med_PFS$lower, 2), "to", signif(med_PFS$upper, 2),")"), hjust = 0, size = 5)
PFS
Create KM for OS, stratified by sCR/CR vs VGPR/PR
Show code
data1 <- dataset %>%
mutate (
response.category = recode ( best_response , "scr" = "sCR/CR" , "cr" = "sCR/CR" , "vgpr" = "VGPR/PR" , "pr" = "VGPR/PR" )
)
km_OS <- survfit ( Surv ( ( Days.to.death.or.DLC ) / 30 , death ) ~ response.category , data = data1 )
med_OS <- surv_median ( km_OS )
OS <- ggsurvplot ( km_OS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Overall survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend.labs = c ( "sCR/CR" ,"VGPR/PR" ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
OS
Show code
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ response.category,
data = data1)
n events median 0.95LCL 0.95UCL
response.category=sCR/CR 17 12 35.5 27.5 NA
response.category=VGPR/PR 8 7 19.1 17.1 NA
Show code
km_PFS <- survfit ( Surv ( ( Days.to.death.or.relapse.or.DLC - 28 ) / 30 , relapse ) ~ response.category , data = data1 )
PFS <- ggsurvplot ( km_PFS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
xlab= "Time (months)" , ylab = "Progression-free survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend.labs = c ( "sCR/CR" ,"VGPR/PR" ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
PFS
Show code
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC - 28)/30,
relapse) ~ response.category, data = data1)
n events median 0.95LCL 0.95UCL
response.category=sCR/CR 17 14 20.20 17.07 36.5
response.category=VGPR/PR 8 8 7.28 6.93 NA
Create KM for OS & PFS, stratified by treatment lines <8 vs >=8
Show code
data1 <- dataset %>%
mutate (
prior.lines.8 = ifelse ( no_priortx >= 8 , 1 ,0 )
)
km_PFS <- survfit ( Surv ( ( Days.to.death.or.relapse.or.DLC ) / 30 , relapse ) ~ prior.lines.8 , data = data1 )
med_PFS <- surv_median ( km_PFS )
PFS <- ggsurvplot ( km_PFS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Progression-free survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend.labs = c ( "<8" ,"\u22658" ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
PFS
Show code
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30,
relapse) ~ prior.lines.8, data = data1)
n events median 0.95LCL 0.95UCL
prior.lines.8=0 11 10 12.6 8.37 NA
prior.lines.8=1 14 12 21.1 12.20 NA
Show code
km_OS <- survfit ( Surv ( ( Days.to.death.or.DLC ) / 30 , death ) ~ prior.lines.8 , data = data1 )
med_OS <- surv_median ( km_OS )
OS <- ggsurvplot ( km_OS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Overall survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend.labs = c ( "<8" ,"\u22658" ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
OS
Show code
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ prior.lines.8,
data = data1)
n events median 0.95LCL 0.95UCL
prior.lines.8=0 11 7 20.4 17.7 NA
prior.lines.8=1 14 12 33.0 25.4 NA
Create KM for OS & PFS, stratified by hx of prior allo
Show code
data1 <- dataset %>%
mutate (
prior.lines.8 = ifelse ( no_priortx >= 8 , 1 ,0 )
)
km_PFS <- survfit ( Surv ( ( Days.to.death.or.relapse.or.DLC ) / 30 , relapse ) ~ allo , data = data1 )
med_PFS <- surv_median ( km_PFS )
PFS <- ggsurvplot ( km_PFS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Progression-free survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
PFS
Show code
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30,
relapse) ~ allo, data = data1)
n events median 0.95LCL 0.95UCL
allo=0 20 18 16.0 8.07 31.7
allo=1 5 4 21.1 12.20 NA
Show code
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30,
relapse) ~ allo, data = data1)
allo=0
time n.risk n.event survival std.err
12.000 12.000 8.000 0.600 0.110
lower 95% CI upper 95% CI
0.420 0.858
allo=1
time n.risk n.event survival std.err
12.000 4.000 1.000 0.800 0.179
lower 95% CI upper 95% CI
0.516 1.000
Show code
km_OS <- survfit ( Surv ( ( Days.to.death.or.DLC ) / 30 , death ) ~ allo , data = data1 )
med_OS <- surv_median ( km_OS )
OS <- ggsurvplot ( km_OS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Overall survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
OS
Show code
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ allo,
data = data1)
n events median 0.95LCL 0.95UCL
allo=0 20 15 27.5 20.4 NA
allo=1 5 4 61.5 17.7 NA
Show code
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ allo,
data = data1)
allo=0
time n.risk n.event survival std.err
12.0000 17.0000 3.0000 0.8500 0.0798
lower 95% CI upper 95% CI
0.7071 1.0000
allo=1
time n.risk n.event survival std.err
12 5 0 1 0
lower 95% CI upper 95% CI
1 1
Create KM for OS & PFS, stratified by receipt of prior BCMA-directed therapy
Show code
data1 <- dataset %>%
mutate (
prior.lines.8 = ifelse ( no_priortx >= 8 , 1 ,0 )
)
km_PFS <- survfit ( Surv ( ( Days.to.death.or.relapse.or.DLC ) / 30 , relapse ) ~ any_bcma_tx , data = data1 )
med_PFS <- surv_median ( km_PFS )
PFS <- ggsurvplot ( km_PFS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Progression-free survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
PFS
Show code
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30,
relapse) ~ any_bcma_tx, data = data1)
n events median 0.95LCL 0.95UCL
any_bcma_tx=0 22 19 18.0 8.73 31.7
any_bcma_tx=1 3 3 12.2 5.87 NA
Show code
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30,
relapse) ~ any_bcma_tx, data = data1)
any_bcma_tx=0
time n.risk n.event survival std.err
12.000 14.000 8.000 0.636 0.103
lower 95% CI upper 95% CI
0.464 0.873
any_bcma_tx=1
time n.risk n.event survival std.err
12.000 2.000 1.000 0.667 0.272
lower 95% CI upper 95% CI
0.300 1.000
Show code
km_OS <- survfit ( Surv ( ( Days.to.death.or.DLC ) / 30 , death ) ~ any_bcma_tx , data = data1 )
med_OS <- surv_median ( km_OS )
OS <- ggsurvplot ( km_OS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Overall survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
OS
Show code
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ any_bcma_tx,
data = data1)
n events median 0.95LCL 0.95UCL
any_bcma_tx=0 22 17 27.5 20.4 NA
any_bcma_tx=1 3 2 32.1 10.1 NA
Show code
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ any_bcma_tx,
data = data1)
any_bcma_tx=0
time n.risk n.event survival std.err
12.0000 20.0000 2.0000 0.9091 0.0613
lower 95% CI upper 95% CI
0.7966 1.0000
any_bcma_tx=1
time n.risk n.event survival std.err
12.000 2.000 1.000 0.667 0.272
lower 95% CI upper 95% CI
0.300 1.000
Create KM for OS & PFS, stratified by triple refractory disease
Show code
km_PFS <- survfit ( Surv ( ( Days.to.death.or.relapse.or.DLC ) / 30 , relapse ) ~ triple_ref , data = dataset )
med_PFS <- surv_median ( km_PFS )
PFS <- ggsurvplot ( km_PFS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Progression-free survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
PFS
Show code
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30,
relapse) ~ triple_ref, data = dataset)
n events median 0.95LCL 0.95UCL
triple_ref=0 5 5 12.2 8.37 NA
triple_ref=1 20 17 18.0 8.73 37.4
Show code
km_OS <- survfit ( Surv ( ( Days.to.death.or.DLC ) / 30 , death ) ~ triple_ref , data = dataset )
med_OS <- surv_median ( km_OS )
OS <- ggsurvplot ( km_OS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Overall survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
OS
Show code
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ triple_ref,
data = dataset)
n events median 0.95LCL 0.95UCL
triple_ref=0 5 4 27.5 18.5 NA
triple_ref=1 20 15 32.1 20.4 NA
Create KM for OS & PFS, stratified by penta refractory disease
Show code
km_PFS <- survfit ( Surv ( ( Days.to.death.or.relapse.or.DLC ) / 30 , relapse ) ~ pentaref , data = dataset )
med_PFS <- surv_median ( km_PFS )
PFS <- ggsurvplot ( km_PFS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Progression-free survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
PFS
Show code
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30,
relapse) ~ pentaref, data = dataset)
n events median 0.95LCL 0.95UCL
pentaref=0 8 7 16.0 12.20 NA
pentaref=1 17 15 21.1 8.07 37.4
Show code
km_OS <- survfit ( Surv ( ( Days.to.death.or.DLC ) / 30 , death ) ~ triple_ref , data = dataset )
med_OS <- surv_median ( km_OS )
OS <- ggsurvplot ( km_OS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Overall survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
OS
Show code
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ triple_ref,
data = dataset)
n events median 0.95LCL 0.95UCL
triple_ref=0 5 4 27.5 18.5 NA
triple_ref=1 20 15 32.1 20.4 NA
Create KM for OS & PFS, stratified by tumor burden (BMPCs <=30 vs >30)
Show code
km_PFS <- survfit ( Surv ( ( Days.to.death.or.relapse.or.DLC ) / 30 , relapse ) ~ High.tumor.burden , data = dataset )
med_PFS <- surv_median ( km_PFS )
PFS <- ggsurvplot ( km_PFS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Progression-free survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend.labs = c ( "Low" ,"High" ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
PFS
Show code
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30,
relapse) ~ High.tumor.burden, data = dataset)
n events median 0.95LCL 0.95UCL
High.tumor.burden=0 8 7 24.3 18.00 NA
High.tumor.burden=1 17 15 12.6 8.37 NA
Show code
km_OS <- survfit ( Surv ( ( Days.to.death.or.DLC ) / 30 , death ) ~ High.tumor.burden , data = dataset )
med_OS <- surv_median ( km_OS )
OS <- ggsurvplot ( km_OS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Overall survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend.labs = c ( "Low" ,"High" ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
OS
Show code
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ High.tumor.burden,
data = dataset)
n events median 0.95LCL 0.95UCL
High.tumor.burden=0 8 5 48.6 33.0 NA
High.tumor.burden=1 17 14 22.8 17.7 NA
Show code
[1] 2.915
Show code
km_PFS <- survfit ( Surv ( ( Days.to.death.or.relapse.or.DLC - 90 ) / 30 , relapse ) ~ sBCMA.high , data = data1 )
med_PFS <- surv_median ( km_PFS )
PFS <- ggsurvplot ( km_PFS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Progression-free survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend.labs = c ( "Low" ,"High" ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
PFS
Show code
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC - 90)/30,
relapse) ~ sBCMA.high, data = data1)
n events median 0.95LCL 0.95UCL
sBCMA.high=0 10 10 21.80 15.00 NA
sBCMA.high=1 10 8 7.28 4.33 NA
Show code
km_OS <- survfit ( Surv ( ( Days.to.death.or.DLC - 90 ) / 30 , death ) ~ sBCMA.high , data = data1 )
med_OS <- surv_median ( km_OS )
OS <- ggsurvplot ( km_OS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Overall survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend.labs = c ( "Low" ,"High" ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
OS
Show code
Call: survfit(formula = Surv((Days.to.death.or.DLC - 90)/30, death) ~
sBCMA.high, data = data1)
n events median 0.95LCL 0.95UCL
sBCMA.high=0 10 7 55.4 30.0 NA
sBCMA.high=1 10 8 18.5 12.5 NA
Show code
[1] 5.415
Show code
km_PFS <- survfit ( Surv ( ( Days.to.death.or.relapse.or.DLC - 60 ) / 30 , relapse ) ~ sBCMA.high , data = data1 )
med_PFS <- surv_median ( km_PFS )
PFS <- ggsurvplot ( km_PFS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Progression-free survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend.labs = c ( "Low" ,"High" ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
PFS
Show code
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC - 60)/30,
relapse) ~ sBCMA.high, data = data1)
n events median 0.95LCL 0.95UCL
sBCMA.high=0 12 11 19.1 10.63 NA
sBCMA.high=1 12 10 11.1 6.07 NA
Show code
km_OS <- survfit ( Surv ( ( Days.to.death.or.DLC - 60 ) / 30 , death ) ~ sBCMA.high , data = data1 )
med_OS <- surv_median ( km_OS )
OS <- ggsurvplot ( km_OS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Overall survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend.labs = c ( "Low" ,"High" ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
OS
Show code
Call: survfit(formula = Surv((Days.to.death.or.DLC - 60)/30, death) ~
sBCMA.high, data = data1)
n events median 0.95LCL 0.95UCL
sBCMA.high=0 12 8 33.5 23.4 NA
sBCMA.high=1 12 10 17.1 13.5 NA
Create KM for OS & PFS, stratified by BCMA ABC at screening
Show code
[1] 620
Show code
km_PFS <- survfit ( Surv ( ( Days.to.death.or.relapse.or.DLC ) / 30 , relapse ) ~ BCMA.high , data = data1 )
med_PFS <- surv_median ( km_PFS )
PFS <- ggsurvplot ( km_PFS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Progression-free survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend.labs = c ( "Low" ,"High" ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
PFS
Show code
Call: survfit(formula = Surv((Days.to.death.or.relapse.or.DLC)/30,
relapse) ~ BCMA.high, data = data1)
n events median 0.95LCL 0.95UCL
BCMA.high=0 12 11 13.3 8.07 NA
BCMA.high=1 13 11 21.1 8.37 NA
Show code
km_OS <- survfit ( Surv ( ( Days.to.death.or.DLC ) / 30 , death ) ~ BCMA.high , data = data1 )
med_OS <- surv_median ( km_OS )
OS <- ggsurvplot ( km_OS ,
pval= TRUE ,
conf.int = TRUE ,
risk.table = TRUE , # Add risk table
fontsize = 6 ,
risk.table.col = "strata" , # Change risk table color by groups
tables.height = 0.25 ,
tables.theme = theme_cleantable ( ) ,
#surv.median.line = "hv", # Specify median survival
#ggtheme = theme_bw(), # Change ggplot2 theme
#palette = c("#E7B800", "#2E9FDF"),
xlab= "Time (months)" , ylab = "Overall survival" ,
xlim = c ( 0 ,65 ) , break.x.by = c ( 12 ) ,
ylim = c ( 0 ,1 ) , break.y.by = c ( 0.25 ) ,
legend.labs = c ( "Low" ,"High" ) ,
legend = "none" ,
surv.scale= "percent" ,
font.main = c ( 16 , "plain" , "black" ) ,
font.x = c ( 16 , "plain" , "black" ) ,
font.y = c ( 16 , "plain" , "black" ) ,
font.caption = c ( 16 , "plain" , "black" ) ,
font.tickslab = c ( 16 , "plain" , "black" )
)
OS
Show code
Call: survfit(formula = Surv((Days.to.death.or.DLC)/30, death) ~ BCMA.high,
data = data1)
n events median 0.95LCL 0.95UCL
BCMA.high=0 12 8 22.8 18.5 NA
BCMA.high=1 13 11 35.5 17.7 NA
Regression analysis
Cox regression
Show code
theme_gtsummary_compact ( )
preds <- c ( "HRCA" , "cnLOH" , "response.category" , "intended_cell_dose" , "High.tumor.burden" ,"any_bcma_tx" ,"pentaref" ,"triple_ref" , "sBCMA.d90" , "sBCMA.d60" )
data1 <- dataset %>%
mutate (
response.category = recode ( best_response , "scr" = "sCR/CR" , "cr" = "sCR/CR" , "vgpr" = "VGPR/PR" , "pr" = "VGPR/PR" ) ,
intended_cell_dose = log10 ( intended_cell_dose )
)
uv_tab_OS <- tbl_uvregression (
data1 [ c ( preds ) ] ,
method = coxph ,
y = Surv ( data1 $ Days.to.death.or.DLC , data1 $ death ) ,
exponentiate = TRUE
) %>%
sort_p ( )
uv_tab_PFS <- tbl_uvregression (
data1 [ c ( preds ) ] ,
method = coxph ,
y = Surv ( data1 $ Days.to.death.or.relapse.or.DLC , data1 $ relapse ) ,
exponentiate = TRUE
)
tbl_merge ( list ( uv_tab_OS , uv_tab_PFS ) , tab_spanner = c ( "**OS**" , "**PFS**" ) )
Characteristic
OS
PFS
N
HR
95% CI
p-value
N
HR
95% CI
p-value
sBCMA.d90
21
1.12
1.03, 1.22
0.006
21
1.10
1.00, 1.21
0.045
sBCMA.d60
24
1.04
1.01, 1.07
0.007
24
1.04
1.01, 1.08
0.018
response.category
25
25
sCR/CR
—
—
—
—
VGPR/PR
3.22
1.15, 9.06
0.027
2.01
0.82, 4.95
0.13
High.tumor.burden
25
2.97
0.96, 9.21
0.059
25
2.65
0.92, 7.66
0.072
intended_cell_dose
25
1.80
0.35, 9.17
0.5
25
0.82
0.18, 3.67
0.8
cnLOH
22
1.23
0.42, 3.59
0.7
22
0.99
0.36, 2.69
>0.9
pentaref
25
0.85
0.31, 2.33
0.8
25
0.72
0.28, 1.85
0.5
triple_ref
25
0.91
0.30, 2.81
0.9
25
0.65
0.24, 1.81
0.4
HRCA
25
0.95
0.36, 2.50
>0.9
25
1.31
0.55, 3.16
0.5
any_bcma_tx
25
1.09
0.24, 4.85
>0.9
25
1.92
0.54, 6.76
0.3
Scatterplot
TTR by BCMA ABC at baseline in relapsed patients
Show code
data1 <- dataset %>%
filter ( relapse == 1 ) %>%
transmute (
bcma_scrn = log ( bcma_scrn ) ,
time.to.relapse = Days.to.death.or.relapse.or.DLC / 30
)
ggplot ( data1 , aes ( x= time.to.relapse , y = bcma_scrn ) ) +
geom_point ( shape = 16 ) + # Add points to the plot with shape 16 (i.e., basic circle)
theme_classic ( ) + # Use the minimal theme
geom_smooth ( aes ( x = time.to.relapse , y= bcma_scrn ) , method = "lm" , se = TRUE , color = "#104a8e" , inherit.aes = FALSE , linetype = "solid" , size = 0.5 ) +
stat_cor ( method = "pearson" , label.x = 3 , label.y = 9 ) +
labs ( x = "Time to relapse (months)" , y = "log(BCMA ABC)" )
Probability plots
Hazard of OS vs sBCMA d90
Show code
data1 <- dataset %>%
select ( sBCMA.d90 , Days.to.death.or.DLC , death ) %>%
filter ( ! is.na ( sBCMA.d90 ) ) %>%
mutate (
sBCMA.high = ifelse ( sBCMA.d90 >= median ( sBCMA.d90 ) ,1 ,0 )
)
dd <- datadist ( data1 )
options ( datadist= 'dd' )
S <- Surv ( data1 $ Days.to.death.or.DLC , data1 $ death )
f <- cph ( S ~ sBCMA.d90 , x= TRUE , y= TRUE ,surv= TRUE ,data= data1 )
model <- Predict ( f , sBCMA.d90 , fun= function ( x ) exp ( x ) )
ggplot ( as.data.frame ( model ) ,aes ( x= sBCMA.d90 , y= yhat ) ) +
geom_ribbon ( data = model , aes ( ymin= lower , ymax= upper ) , alpha= 0.2 , linetype= 0 ) +
geom_line ( ) +
theme_bw ( ) +
labs (
x = "sBCMA d90" ,
y = "OS (hazard)" ) +
theme ( title = element_text ( size= 16 ,face= "bold" ) ,legend.title= element_blank ( ) )
Hazard of OS vs screening BCMA ABC
Show code
data1 <- dataset %>%
select ( bcma_scrn , Days.to.death.or.DLC , death )
dd <- datadist ( data1 )
options ( datadist= 'dd' )
S <- Surv ( data1 $ Days.to.death.or.DLC , data1 $ death )
f <- cph ( S ~ rcs ( bcma_scrn ,3 ) , x= TRUE , y= TRUE ,surv= TRUE ,data= data1 )
model <- Predict ( f , bcma_scrn , fun= function ( x ) exp ( x ) )
ggplot ( as.data.frame ( model ) ,aes ( x= bcma_scrn , y= yhat ) ) +
geom_ribbon ( data = model , aes ( ymin= lower , ymax= upper ) , alpha= 0.2 , linetype= 0 ) +
geom_line ( ) +
theme_bw ( ) +
labs (
x = "sBCMA d90" ,
y = "OS (hazard)" ) +
theme ( title = element_text ( size= 16 ,face= "bold" ) ,legend.title= element_blank ( ) )